package ink.ykb.demo.user.service;

import java.util.List;

import ink.ykb.demo.permission.entity.DealerDepartment;
import ink.ykb.demo.permission.entity.Role;
import ink.ykb.demo.permission.entity.Rule;
import ink.ykb.demo.permission.entity.UserDealerDepartment;
import ink.ykb.demo.permission.service.dto.UserPermissionInfo;
import ink.ykb.demo.user.entity.UserInfo;

public interface UserService {

	/**
	 * 获取当前登录的用户信息 <br>
	 * 注意：获取不到信息会抛异常
	 * 
	 * @return
	 */
	UserInfo getCurrentUserInfo();

	/**
	 * 获取当前登录用户ID <br>
	 * 注意：获取不到信息会抛异常
	 * 
	 * @return
	 */
	Long getCurrentUserId();

	/**
	 * 获取当前登录的用户信息 <br>
	 * 注意：获取不到信息不会抛异常，返回null
	 * 
	 * @return
	 */
	UserInfo getCurrentUserInfoNoCheck();

	/**
	 * 获取当前登录用户ID <br>
	 * 注意：获取不到信息不会抛异常，返回null
	 * 
	 * @return
	 */
	Long getCurrentUserIdNoCheck();

	/**
	 * 获取当前登陆人权限信息 <br>
	 * 注意：查询不到可能返回空
	 * 
	 * @return
	 */
	UserPermissionInfo getCurrentUserPermissionInfo();

	UserPermissionInfo getUserPermissionInfo(Long userId);

	/**
	 * 获取当前用户TOKEN
	 * 
	 * @return
	 */
	String getCurrentUserToken();

	/**
	 * 登录
	 * 
	 * @param userName
	 * @param password
	 * @return token
	 */
	String login(String userName, String password);

	/**
	 * 获取用户菜单
	 * 
	 * @return
	 */
	List<Rule> getUserMenu();
	
	/**
	 * 判断用户是否为超级管理员
	 * @param userId
	 * @return
	 */
	boolean isSuperAdmin(Long userId);
	
	/**
	 * 判断用户是否为超级管理员
	 * @param userRoleList
	 * @return
	 */
	boolean isSuperAdmin(List<Role> userRoleList);
	
	/**
	 * 当前用户创建子部门
	 * @param dealerDepartment
	 */
	void addDealerDepartment(DealerDepartment dealerDepartment);
	
	/**
	 * 当前用户递归修改子部门
	 * @param dealerDepartmentId
	 */
	void updateDealerDepartment(DealerDepartment dealerDepartment);
	
	/**
	 * 判断是否有操作子级部门的权限
	 * @param parentId 父级部门ID
	 * @param parentScope 用户的权限范围
	 * @param childId  子级部门ID
	 * @return
	 */
	boolean hasDoDealerDepartmentPermission(Long parentId,Integer parentScope,Long childId);
	
	/**
	 * 判断是否有操作子级部门的用户的权限
	 * @param parentId 父级部门ID
	 * @param parentScope 用户的权限范围
	 * @param childId  子级部门ID
	 * @param childScope 被添加的用户权限范围
	 * @return
	 */
	boolean hasDoUserDealerDepartmentPermission(
			Long parentId,Integer parentScope,Long childId,Integer childScope);
	
	/**
	 * 当前用户递归删除子部门
	 * @param dealerDepartmentId
	 */
	void deleteDealerDepartment(Long dealerDepartmentId);
	
	/**
	 * 当前用户添加用户到指定部门
	 * @param userId
	 * @param dealerDepartmentId
	 * @param scope
	 */
	void addUserDealerDepartment(Long dealerDepartmentId,Long userId,Integer scope);
	
	/**
	 * 当前用户修改用户到指定部门
	 * @param userId
	 * @param dealerDepartmentId
	 * @param scope
	 */
	void updateUserDealerDepartment(Long dealerDepartmentId,Long userId,Integer scope);
	
	/**
	 * 当前用户删除指定部门的用户
	 * @param userId
	 */
	void deleteUserDealerDepartment(Long userId);
	
	/**
	 * 获取用户的经销商部门树 <br>
	 * 注意：结构为 根部门 --> 当前用户部门 --> 所有能到达的根部门 <br>
	 * 用作展示，不能用作部门权限校验
	 * @return
	 */
	List<DealerDepartment> getUserDealerDepartmentTree();
	
	/**
	 * 获取用户可以查看的经销商部门权限范围
	 * @return 经销商部门权限集合
	 */
	List<DealerDepartment> getUserDealerDepartmentPermission();
	
	/**
	 * 获取用户的可查询到的经销商部门的用户权限范围  <br>
	 * @return
	 */
	List<UserDealerDepartment> getUsersByDealerDepartmentPermission();
	
	/**
	 * 根据用户权限和部门ID查询部门下的用户
	 * @param dealerDepartmentId
	 * @return
	 */
	List<UserDealerDepartment> getUsersByDealerDepartmentPermission(Long dealerDepartmentId);
}
